www.gusucode.com > VC编写的串口调试软件 > VC编写的串口调试软件,内含Modbus协议类 支持对Modbus通讯调试/Modbus串口调试软件1.0/DlgModbus.cpp
// DlgModbus.cpp : implementation file // #include "stdafx.h" #include "ModbusRTU.h" #include "DlgModbus.h" #include "ModBus.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDlgModbus dialog CDlgModbus::CDlgModbus(CWnd* pParent /*=NULL*/) : CDialog(CDlgModbus::IDD, pParent) { //{{AFX_DATA_INIT(CDlgModbus) m_unRegAddress = 0; m_unRegCount = 1; m_unStation = 1; m_strRegType = _T(" 3"); m_bFrameMode = MODBUS_RTU; //}}AFX_DATA_INIT } void CDlgModbus::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgModbus) DDX_Text(pDX, IDC_EDIT_ADDRESS, m_unRegAddress); DDX_Text(pDX, IDC_EDIT_COUNT, m_unRegCount); DDX_Text(pDX, IDC_EDIT_STATTIONNUM, m_unStation); DDX_CBString(pDX, IDC_COMBO_FUNCTION, m_strRegType); DDX_Radio(pDX, IDC_CHECK01, m_bFrameMode); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDlgModbus, CDialog) //{{AFX_MSG_MAP(CDlgModbus) ON_WM_DESTROY() ON_CBN_SELCHANGE(IDC_COMBO_FUNCTION, OnSelchangeComboFunction) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgModbus message handlers void CDlgModbus::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here delete this; } int CDlgModbus::GetSendTxt(unsigned char * pucSendTxt) { CEdit* pEdit; CString strtxt; //站号 pEdit =(CEdit*)GetDlgItem(IDC_EDIT_STATTIONNUM); pEdit->GetWindowText (strtxt); strtxt.Trim(); if(strtxt.IsEmpty ()) return -1; //地址 pEdit =(CEdit*)GetDlgItem(IDC_EDIT_ADDRESS); pEdit->GetWindowText (strtxt); strtxt.Trim(); if(strtxt.IsEmpty ()) return -1; //数量 pEdit =(CEdit*)GetDlgItem(IDC_EDIT_COUNT); pEdit->GetWindowText (strtxt); strtxt.Trim(); if(strtxt.IsEmpty ()) return -1; UpdateData(TRUE); CString strText; CComData cComData; cComData.m_unStationNum =m_unStation; cComData.m_unRegType=atoi(m_strRegType); cComData.m_unRegAddr =m_unRegAddress; if(cComData.m_unRegType==5) { cComData.m_unRegCount=1; if(m_unRegCount>0) cComData.m_strRegValue="1"; } else if(cComData.m_unRegType==6) { cComData.m_unRegCount=1; cComData.m_strRegValue.Format ("%d",m_unRegCount); } else cComData.m_unRegCount=m_unRegCount; CString strSendTxt; unsigned int unCount=0; CModBus cModBus; if(MODBUS_RTU==m_bFrameMode) { cModBus.SetFrameMode(CModBus::MODBUS_RTU); cModBus.Decoding(cComData); // unCount=cComData.m_unDataLen; CString strTxt; unsigned int unIndex; for(unIndex=0;unIndex<unCount;unIndex++) { pucSendTxt[unIndex]=cComData.m_ucProtocalTxt[unIndex] ; unsigned char ucByteH=pucSendTxt[unIndex]>>4; unsigned char ucByteL=pucSendTxt[unIndex]&0x0F; if(ucByteH>=0xA) strTxt.Format ("0x%c",char(ucByteH-0x0A+'A')); else strTxt.Format ("0x%c",char(ucByteH+'0')); if(ucByteL>=0xA) strTxt+=char(ucByteL-0x0A+'A'); else strTxt+=char(ucByteL+'0'); strTxt+=" "; strSendTxt+=strTxt; } } else { //MODBUS_ASCII cModBus.SetFrameMode(CModBus::MODBUS_ASCII); cModBus.Decoding(cComData); // unCount=cComData.m_unDataLen; unsigned int unIndex; for(unIndex=0;unIndex<unCount;unIndex++) { pucSendTxt[unIndex]=cComData.m_ucProtocalTxt[unIndex] ; } cComData.m_ucProtocalTxt[unCount]='\0'; strSendTxt=cComData.m_ucProtocalTxt; } CWnd* pWnd=GetDlgItem(IDC_EDIT_SEND); if(pWnd) pWnd->SetWindowText(strSendTxt); return unCount ; } void CDlgModbus::OnCancel() { // TODO: Add extra cleanup here // CDialog::OnCancel(); } void CDlgModbus::OnOK() { // TODO: Add extra validation here // CDialog::OnOK(); } void CDlgModbus::OnSelchangeComboFunction() { // TODO: Add your control notification handler code here UpdateData(TRUE); CWnd* pWnd=GetDlgItem(IDC_STATIC_TIP); if(atoi(m_strRegType)==5 ||atoi(m_strRegType)==6) { pWnd->SetWindowText ("写入值"); } else pWnd->SetWindowText ("数量"); }